package Legend.Resources is

   function Load_Palette (
      filename : String
      ) return Palette_Access;

   function Load_Pictures (
      Index_Filename : String;
      Group_Filename : String
      ) return Pictures_Pointer;

   procedure Load_Room_Pictures (Index : Uint16_t);

   procedure Load_War_Pictures (Index : Uint16_t);

   procedure Load_War_Define_Resources;

   procedure Load_Talk_Resources;

   procedure Load_Palette_Resources;

   procedure Load_Title_Resources;

   procedure Load_Fight_Picture (I : Uint16_t);

   procedure Load_Picture_Resources;

   procedure Load_World_Record (From : String; To : in out World_Record_Pointer);

   procedure Save_World_Record (From : World_Record_Pointer; To : String);

   procedure Load_Scene_Maps (From : String; To : in out Scene_Maps_Pointer);

   procedure Save_Scene_Maps (From : Scene_Maps_Pointer; To : String);

   procedure Load_Scene_Stories (From : String; To : in out Scene_Stories_Pointer);

   procedure Save_Scene_Stories (From : Scene_Stories_Pointer; To : String);

   function Get_Fire_Script_By_Hero (Who : Uint16_t) return Uint16_t;

   procedure Export_Pictures (Pictures : Pictures_Pointer; Path : String);

   -- 主角移动动画入口
   Leader_Horse_Movies : constant Horse_Movie_Groups_Type := (
      No_Horse => (Frame_Entry => 2501, Frame_Count => 7), 
      Boat     => (Frame_Entry => 3715, Frame_Count => 4)
      );

   Leader_Puzzle_Movie : constant Movie_Group_Type := (
      Frame_Entry => 2529, Frame_Count => 6
      );

   Bag_Item_Group : Picture_Group := (3501, 3700);

   -- 世界地图的水域
   World_Waters : constant Picture_Group_Array := (
      (179, 181), (253, 310), (508, 511), (660, 674));

   -- war effects
   -- FIXME : some effect seems not display as DOS game display
   Effect_Frame_Counts : constant Uint16_Array := (
      10,  -- 0,  医疗
      14,  -- 10, 
      17,  -- 24, 雪怪
      9,   -- 41, 金蛇锥
      13,  -- 50, 霹雳弹
      17,  -- 63, 化功大法 | 吸星大法 
      17,  -- 80, 北冥神功
      17,  -- 97, 降龙十八掌
      18,  -- 114, 冰蚕毒掌
      20,  -- 132, 龙象般若功
      
      18,  -- 152, 玄铁剑法
      15,  -- 170, 血刀大法 | 万花剑法 | 判官笔 | 雪山剑法 | 打狗棍法
      13,  -- 185, 叫化棍法 | 野球拳 | 普通攻击 | 鳄鱼
      10,  -- 198, 泼墨剑法
      10,  -- 208, 回峰落雁剑
      15,  -- 218, 蛤蟆功
      21,  -- 233, 七星剑法
      16,  -- 254, 幻阴指
      9,   -- 270, 寒冰神掌 | 灵蛇拳 | 寒冰绵掌 | 神王毒掌 | 毒龙鞭法
      11,  -- 279, 一阳指

      8,   -- 290, 西瓜刀法
      9,   -- 298, 太极拳
      8,   -- 307, 鹰爪功 | 慕容剑法 | 火焰刀法 | 练心弹 | 狮子吼
      8,   -- 315, 飞蝗石 | 金钱镖 | 飞刀 | 菩提子
      7,   -- 323, 剑法: 躺尸 | 冰雪 | 青城 | *五岳* | 全真 | 峨嵋 | 松风 | 武当
      8,   -- 330, 太岳三青峰
      8,   -- 338, 铁掌 | 逍遥剑法 | 达摩剑法 | 五轮大法 | 九阳神功
      9,   -- 346, 武当长拳 | 罗汉拳 | 混元掌 | 千手如来掌 | 黄沙万里鞭 | 持瑶琴
      12,  -- 355, 太极剑法
      19,  -- 367, 金蛇剑法

      11,  -- 386, 毒蒺藜 | 玉蜂针 | 冰魄银针 | 黑血神针 | 用毒
      14,  -- 397, 天山六阳掌
      12,  -- 411, 七伤拳
      16,  -- 423, 六脉神剑
      20,  -- 439, 泰山十八盘 | 神龙双勾 | 持棋盘
      10,  -- 459, 大轮杖法 | 大剪刀 | 金花杖法 | 怪异武器 | 解毒
      13,  -- 469, 
      10,  -- 482, 大蟒蛇 | 两仪剑法 ｜ 反两仪刀法
      19,  -- 492,
      14,  -- 511, 神龙鹿杖 | 黯然销魂掌

      17,  -- 525, 玄冥神掌 | 太玄神功
      19,  -- 542, 空明拳
      14,  -- 561, 狂风刀法 | 胡家刀法 | 逍遥掌 
      21,  -- 575,
      16,  -- 596, 葵花神功
      13,  -- 612, 
      18,  -- 625, 独孤九剑
      14,  -- 643, 玉女素心剑法 | 倚天剑法
      17,  -- 657, 苗家剑法
      17,  -- 674, 霹雳刀法

      16,  -- 691, 玉箫剑法
      7);  -- 707, 辟邪剑法



   -- scene id
   Leader_Home                  : constant := 70;
   Heluo_Inn                    : constant := 1;
   Youjian_Inn                  : constant := 3;
   Yuelai_Inn                   : constant := 40;
   Longmen_Inn                  : constant := 60;
   Gaosheng_Inn                 : constant := 61;
   Beichou_Home                 : constant := 6;
   Nanyuan_Home                 : constant := 64;

   Softboy_Icon                 : constant := 114;
   Weixiaobao_Icon              : constant := 111;

   Shopping_Script              : constant := 938;


   -- item id
   Money_Id                     : constant := 174;
   Compass_Id                   : constant := 182;

   Shadow_Picture  : Picture_Type := ((18, 17), null);
   Locator_Picture : Picture_Type := ((18, 17), null);

   -- 这些对话存储在talk.grp中
   All_Talks : Talks_Pointer := null;

   -- 这些数据存储在war.sta中
   All_War_Defines : War_Defines_Pointer := null;

   Title_Images : Pictures_Pointer;

   Title_Image, Dead_Image : Picture_Type;

   Head_Images : Pictures_Pointer;
   -- 头像贴图资源

   Inner_Images : Pictures_Array_Type(0 .. Stage_Count - 1);
   -- 各内景贴图资源
   
   Outer_Images : Pictures_Pointer;
   -- 外景资源

   Cloud_Images : Pictures_Pointer;
   
   War_Images : Pictures_Array_Type(0 .. War_Stage_Count - 1);
   -- 战斗场景贴图资源
   --

   FMap : Pictures_Pointer;

   FBK_Images : Pictures_Pointer;
   -- 动作动画资源(似乎无用, 因与atk00.grp重复了部分资源)

   -- fight???.grp
   -- hero -> pictures
   Fight_Pictures : Pictures_Array_Type(0 .. 109) := (others => null);
   -- eft.grp
   -- 714 pictures
   Attack_Effects : Pictures_Pointer := null;


   -- 贴图资源
   -- 贴图号0～909：地面地表贴图
   -- 贴图号1001～1245和1348～1445为：地面上建筑、树木等贴图
   -- 贴图号2501～2552：主角站立、行走、站立观望的贴图
   -- 贴图号3501～3700：外景物品贴图
   -- 其他: 场景剧情相关资源

   procedure Read_Picture (
      From : not null access Root_Stream_Type'Class;
      Size : Stream_IO.Count;
      P    : out Picture_Type
      );

   function Read_Heroes (
      From : not null access Root_Stream_Type'Class;
      Count : Uint16_t
      ) return Heroes_Pointer;

   function Read_Items (
      From : not null access Root_Stream_Type'Class;
      Count : Uint16_t
      ) return Items_Pointer;

   function Read_Scenes (
      From : not null access Root_Stream_Type'Class;
      Count : Uint16_t
      ) return Scenes_Pointer;

   function Read_Kongfus (
      From : not null access Root_Stream_Type'Class;
      Count : Uint16_t
      ) return Kongfus_Pointer;

   function Read_Shops (
      From : not null access Root_Stream_Type'Class;
      Count : Uint16_t
      ) return Shops_Pointer;

   -- 加载对话
   function Load_Talks (filename : String := "TALK") return Talks_Pointer;

   -- 加载战斗定义
   function Load_War_Defines (
      Filename : String := "WAR.STA"
      ) return War_Defines_Pointer;

end Legend.Resources;
